
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

#include <stdio.h>
#include <stdlib.h>

void RIT_IRQHandler(void);
int main(void)
{
	volatile static int i = 0 ;
	char buf[64];
	float compteur = 0.0, pulse = 0.0;

	// RIT prend comme source PCLKSEL1, bit 27 & 26
	// -> 00 =>  PCLK=CCLK/4, 01 => PCLK=CCLK, 10 => PCLK=CCLK/2, 11 => PCLK=CCLK/8
	// Soit PCLK pour RIT = CCLK/8 -> 100,000,000 [MHz]/8 = 12,500,000 [MHz] => 80 [ns]
	LPC_SC->PCLKSEL1 |= (1<<27)|(1<<26);
	LPC_SC->PCONP |= 1<<16;  // ! RIT est off au reset -> l'allumer avant utilisation

    do
	{
	 printf("RTI Demo - SysClock = %d [MHz] - RIT sur CCLK/4 -> resolution %d [ns]\n", SystemCoreClock, 1000000000/(SystemCoreClock/8));
	 printf("Pulse en [ms] ?");
	 scanf("%s", buf);
	 pulse = atof(buf);
	 pulse = pulse * 1000000.0; // en [ns]
	 compteur = pulse / 80.0;
	   if ( compteur > 4294967295.0 )
	   	printf("\n! DEPASSEMENT DU COMPTEUR (> 4.294.697.295)\n");
	} while ( compteur > 4294967295.0);

	printf("-> pour interruption RIT toutes les %f [ms], compteur RIT = %f \n", pulse, compteur);
	printf("Valeur 32 bit = %d\n",(uint32_t)compteur);

    NVIC_EnableIRQ(RIT_IRQn);

    LPC_RIT->RICOMPVAL = (uint32_t)compteur;
    // Quelques valeurs avec CCLK/4
    //LPC_RIT->RICOMPVAL = 0xffffffff; // 4.294.697.295 * 80E-09 = 343.56 sec = pulse MAX avec CCLK/8
    //LPC_RIT->RICOMPVAL = 62500000;   // 5 sec
    //LPC_RIT->RICOMPVAL = 62500000/5; // 1 sec
    //LPC_RIT->RICOMPVAL = 62500000*5; // 25 sec
    LPC_RIT->RIMASK = 0x00;

    // Pas d'effet Debug -> bit 2 a zero, Debug n'arretera pas le compteur
    LPC_RIT->RICTRL &= ~(1<<2);

    LPC_RIT->RICTRL |= (1<<1);  // clear Timer quand = a RICOMPVAL, on recommence a compter

    // Demarre RIT par bit 3
    LPC_RIT->RICTRL |= 1<<3;

	while(1)
	{
		for(i=0; i < 1000000; i++);
		//printf("RIT COUNTER = %d - %x (COMPARE=%x)\n", LPC_RIT->RICOUNTER, LPC_RIT->RICOUNTER, LPC_RIT->RICOMPVAL);
	}

	return 0 ;
}
void RIT_IRQHandler(void)
{
	LPC_RIT->RICTRL |= 1<<0;   // RAZ Int (bien utiliser |= sinon manipulation des autres bit !)
	printf("RIT IRQ! -> RIT COUNTER = %d - %x (COMPARE=%x)\n", LPC_RIT->RICOUNTER, LPC_RIT->RICOUNTER, LPC_RIT->RICOMPVAL);
}
